←
▼
▲
Function find( keyword as string, path as string ) as string
テキストファイルの中で、指定したキーワードを含む行をまとめて返します。
【引数】
keyword
検索するキーワード
キーワードを含む行、または複数行
返り値
path
テキストファイルのパス
(src)
サンプル:
lines = find( "<ERROR", "Test_logs.txt" )
Test_logs.txt ファイルのサンプル
start main.vbs
<ERROR msg='not found symbol'/>
Fail.
返り値のサンプル
<ERROR msg='not found symbol'/>
関連
←
▼
▲
Function find_c( keyword as string, path as string ) as integer
テキストファイルの中で、指定したキーワードを含む行数を返します。
【引数】
keyword
path
検索するキーワード
テキストファイルのパス
キーワードを含む行数
返り値
(src)
←
▼
▲
テスト
→ T_fc.vbs
Function SearchStringTemplate( FolderPath as string, RegularExpressionPart as string,
TemplateStrings as array of string, Opt as Empty ) as array of array of GrepFound
テキストファイルの中をキーワードで検索し、どのテンプレートと一致するかを一覧します。
【引数】
FolderPath
RegularExpressionPart
検索対象フォルダーやワイルドカード
テンプレートの中にあるキーワード。複数行不可
TemplateStrings
テンプレート(複数行可)、または、その配列
返り値
の配列の配列
→ ToolsLib.vbs
ソース
T_SearchStringTemplate
関連
founds = SearchStringTemplate( "TargetFolder", "(((", _
"/***********" +vbCRLF+ _
"((( ${FunctionName} ))$\{)" +vbCRLF+ _
"************/" +vbCRLF, Empty )
Assert founds(0)(0).LineNum = 1 '// マッチした
Assert founds(0)(1).LineNum = 5 '// マッチした
Assert founds(1)(0).LineNum = 9 '// マッチしなかった
サンプル
TargetFolder フォルダーの中にあるテキストファイルの中から "(((" を検索し、見つかった
位置に、テンプレート(下記の複数行の文字列) がマッチしているものと、マッチしていない
ものに分けます。
/***********
((( FuncA ))${)
************/
/***********
((( FuncB ))${)
************/
/***********
((( FuncC )))
************/
検索対象のテキストファイル
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
… RegularExpressionPart 引数に指定した ((( にヒットするが、
テンプレートに指定した ${ がないのでマッチしない
キーワードが見つかった位置が、指定したテンプレートの一部であるものと、そうでないものを
一覧します。 これを応用すれば、テンプレートの内容が違っていたり、古いテンプレートのまま
になっていたりするものを見つけることができます。
テンプレートは、可変の部分を "${変数名}" のように記述してください。 可変の部分は、複数行
にまたぐことができます。 SearchStringTemplate 関数はテンプレートの中の変数名を無視しま
すが、テンプレートを ScanFromTemplate 関数などにそのまま渡すことができます。
${ 文字は "$\{" と記述してください。 $\ 文字は "$\\" と記述してください。
関数名: ${FunctionName}
引数: ${Arguments}
返り値: ${RerutnValue}
Opt
Empty を指定してください
返り値が founds のとき、founds(t)(i) の t は TemplateStrings 引数の配列番号、i はテンプレート
にマッチした複数の場所に 0 から順番につけた番号です。
i が配列の要素数に一致する要素は、TemplateStrings 引数に指定したどのテンプレートにも
マッチしなかったテキストについてです。
返り値
TemplateStrings 引数
配列の要素は、
です。
GrepFound オブジェクトのメンバー変数の内容は、次の通りです。
.Path
.LineNum
.LineText
ファイル名
Empty
Array( テンプレートの開始位置(1以上), テンプレートの次の位置 )
GetEchoStr に渡すと、次のように変わります。
テンプレートにマッチしたファイルの中の内容。 複数行の場合あり
行番号。 キーワードがある位置の行番号
ファイル名
.LineText
.LineNum
.Path
が使えます。
←
▼
▲
Function GetLineNumOfTemplateDifference( TargetString as string,
RegularExpressionPart as string, TemplateString as string ) as integer
指定した文字列の中で、テンプレートに一致しない場所の行番号を返します。
【引数】
TargetString
RegularExpressionPart
テンプレートが含まれる(はずの)文字列
テンプレート(複数行可)
TemplateString
テンプレートの書き方について、
line_num = GetLineNumOfTemplateDifference( _
"----" +vbCRLF+_
"----" +vbCRLF+_
"Parameter1: abc" +vbCRLF+_
"Param2: def" +vbCRLF+_
"Parameter3: ghi" +vbCRLF+_
"----" +vbCRLF, _
_
"Parameter1", _
_
"Parameter1: ${1}" +vbCRLF+_
"Parameter2: ${2}" +vbCRLF+_
"Parameter3: ${3}" +vbCRLF )
Assert line_num = 4 '// Param2: の場所の行番号
サンプル
テンプレートに一致しない場所の行番号。 0=すべて一致
返り値
テンプレートの中にあるキーワード。複数行不可
→ ToolsLib.vbs
ソース
→ T_fc.vbs
テスト
T_GetLineNumOfTemplateDifference
関連
←
▼
▲
Function CreateFile( path as string, text as string ) as string
指定のテキストを内容としたテキストファイルを作成します。
【引数】
path
text
作成するテキストファイルのパス
テキストファイルの内容
(src)
text に指定した文字列の末尾に改行が自動的に入らないテキストが作成されます。
カレントフォルダに a.txt ファイルを作る
CreateFile "a.txt", "ABC"
返り値
作成したテキストファイルのフル・パス
path に相対パスを指定したとき、基準フォルダはカレント・フォルダになりますが、ワイルド
カードが含まれていると、テンポラリ・フォルダになります。 詳しくは、
start CreateFile( "*.xml", obj.xml )
obj
obj の xml プロパティを、テンポラリファイルに出力して開く
関連
を使うと、テキストファイルのフォーマットを指定できます。
→ T_File.vbs [T_CreateFile]
テスト
を使うと、内部で
を使います。
参考
→ FileT_create (clib)
mini (src)
→ T_File.vbs [T_CreateFile_Err]
サンプル
サンプル
サンプル
path = "_work.txt"
text = ReadFile( path )
'// ここで text を変更
Set cs = new_TextFileCharSetStack( ReadUnicodeFileBOM( path ) )
CreateFile path, text
cs = Empty
補足
Unicode 形式かどうかを維持してファイルの内容を変更する
注意
下記の方法より、
を変更する方が扱いやすいでしょう。
←
▼
▲
この警告が出る最も多い原因は、ユーザが設定した場所に書き込み許可を設定しなかった
スクリプトのバグです。 スクリプト開発者は、
[WARNING] Out of Writable, see "Out of Writable" in vbslib manual.
"C:\home\scriptlib\vbslib_new\_src\Test\vbslib_test\T_Writable\work2"
スクリプトが想定していない場所に、ファイルを出力しようとしたとき、出力してよいかユーザに
確認を取ります。
コマンドプロンプトへの出力例:
確認ウィンドウ:
を使ってください。
vbslib を使ったスクリプトは、ダブルクリックした .vbs ファイルがあるフォルダ、または、ユーザが
設定した場所のフォルダのどちらかしか、ファイルを作成したり削除しないように作られます。
このルールが守られなかったとき、警告が出ます。
この機能は、スクリプト開発者のミスによって問題が起きないようにするためのものであり、
悪意のあるスクリプトは、この警告を出さないでファイルを壊すこともあります。
デバッガでスクリプトを起動し、Out of Writable の警告で、プログラムの終了やキャンセルを
選ぶと、例外によりブレークします。
Err.Raise E_OutOfWritable,, "Out of Writable """ & CheckPath & """"
' Watch g_CurrentWritables.CurrentPathes and CheckPath
g_CurrentWritables.CurrentPathes や CheckPath をウォッチウィンドウでチェックしてください。
コールツリー
mkdir など
g_AppKey.CheckWritable
m_Key.CheckWritable
g_CurrentWritables.CheckWritable
m_Key.CheckPlusWritable
"...\*" 以外のチェック
"...\*" で追加されたものと比較
m_Key.Ask
警告の表示
m_PlusWritables( UBound( m_PlusWritables ) ) = abs_path
Writable を追加
隠しキーのメソッド
公開キーのメソッド
テスト
グローバル変数のデストラクタでファイル操作をすると、メイン関数で作成した Writables
オブジェクトが削除された後なので、必ず警告が発生します。
If IsEmpty( abs_path ) Then Exit Sub
Writable の中なので OK
AppKey.NewWritable
Writables::SetPathes
m_Pathes( UBound( m_Pathes ) ) = g_TempFile.m_FolderPath + "\"
m_Pathes(i) = abs_path + "\"
Writable の登録
テンポラリを Writable に登録
g_CurrentWritables.AskFileAccess
Writables::Enable
WritablesStack::PushPathes
CurrentWritables::PushPathes
m_PathesStack.Push
Writable を有効にする
をばらまいてください。
Writable の状況を確認したいときは、
AppKeyClass::Ask
の中と、拡張子が .updating のパスについては、NewWritable を
使う必要はありません。
←
▼
▲
Function AppKeyClass::NewWritable( Pathes as variant ) as Writables
Sub Main( Opt, AppKey )
Set w_= AppKey.NewWritable( "." ).Enable()
'// 書き込み可能な範囲
w_ = Empty '// これを書かないときは、関数が終わるまでが範囲
End Sub
サンプル1: カレントフォルダを書き込み可能にする
サンプル: 後で out フォルダを書き込み可能にする
Sub Main( Opt, AppKey )
Set wr = AppKey.NewWritable( "out" )
sub2 wr
End Sub
Sub sub2( wr )
Set w_ = wr.Enable()
'// "out" に書き込み可能な範囲
End Sub
書き込み可能なフォルダの設定オブジェクトを生成します。
【引数】
Pathes
書き込み可能なフォルダの
返り値
Writable 設定オブジェクト
通常は、サンプル1のように使い、NewWritable 関数の引数を調整します。
もしくは、使っているオブジェクトの
渡すと、書き込み可能なフォルダの設定を不正に変えられる可能性があります。
返り値である Writable 設定オブジェクトは、他の関数に渡すことができます。
AppKey は、なるべく他の関数に渡さないようにしてください。
Sub Main( Opt, AppKey )
Set w_= AppKey.NewWritable( Array("out1","out2") ).Enable()
'// 書き込み可能な範囲
End Sub
サンプル: 複数のフォルダを書き込み可能にする
AppKeyClass は、
NewWritable( "." )
(src)
。文字列、または文字列の配列
関連
サンプル: デスクトップに新規フォルダの作成を可能にし、新規フォルダの中だけ
書き込み可能にする。
新規フォルダを作成することができるフォルダのパスの後に \* を指定してください。
Sub Main( Opt, AppKey )
desktop = g_sh.SpecialFolders( "Desktop" )
Set w_= AppKey.NewWritable( desktop+"\*" ).Enable()
mkdir desktop+"\New Folder"
'// 書き込み可能な範囲
w_ = Empty '// これを書かないときは、関数が終わるまでが範囲
End Sub
Pathes に指定するパスの最後に "\*" があると、新規フォルダの作成を可能にし、
新規フォルダの中は書き込み可能にします。 "C:\folder1\*" とすると、C:\folder1
にファイルを作成できませんが、フォルダは作成できます。
すでに C:\folder1 にあるフォルダの中は、上書きされないように、書き込み不可
になります。
が出ないようになります。
本関数を正しく使えば、
テスト
Program Files などの OS のシステムフォルダを NewWritable に指定すると、
System folder access の警告になります。 この警告を自動的に無視するときは、
NewWritable を呼び出す前に
に F_IgnoreIfWarn を指定して、
呼び出してください。
→ T_Writable フォルダ
を使います。
の第2引数である AppKey のクラスです。
の中と、拡張子が
を使う必要はありません。
Cannot overwrite NOT NEW file
このエラーが発生したときは、次のいずれかがエラー メッセージに含まれます。
Cannot overwrite NOT NEW folder
のパスについては、NewWritable
←
▼
▲
Sub main2( Opt, AppKey )
Dim writable : writable = m.GetWritable
If not AppKey.InPath( writable, "..\out" ) Then Error
Dim w_ : Set w_= AppKey.NewWritable( writable ).Enable()
'// 書き込み可能な範囲
w_ = Empty
End Sub
使用サンプル:
Function ClassA::GetWritable() as array of string
書き込み許可の設定が必要なフォルダーの一覧を取得します。
GetWritable メソッドは、それぞれのクラスで定義してください。
writable
writable
writable
定義サンプル:
Class ClassA
Public Function GetWritable()
GetWritable = Array( "Work" )
End Function
End Class
←
▼
▲
Function AppKeyClass::InPath( Paths as Array of string, EnablePath as string ) as boolean
サンプル:
Paths に指定したパスの集合が、EnablePath の中に含まれるかどうかを返します。
【引数】
Paths
EnablePath
パスの配列
許可しているパス
返り値
Paths の要素がすべて許可しているパスに含まれているかどうか
ファイル:
vbslib.vbs
(src)
←
▼
▲
(src)
Sub AppKeyClass::CheckWritable( Path as string, Opt as variant )
指定したパスが、
【引数】
Path
Opt
チェックするパス
Empty または c.ForMkDir (*1)
されているかどうかチェックします。
(*1)
Path が、Enable (Writables) されていなかったら、
が出ます。
Opt 引数に、g_VBS_Lib.ForMkDir を指定すると、Path に指定したパスの
フォルダーを作るために、Path の子フォルダー(Path より長いパス)だけが、
Enable (Writables) されていたときでも、チェックに引っかからなくなります。
g_AppKey.CheckWritable "C:\Users\user1\log.txt", Empty
サンプル
関連
←
▼
▲
Sub AppKeyClass::Watch()
Writable の状態を echo 出力します。
サンプル
g_AppKey.Watch
g_AppKey は、公開キーとして用意されているグローバル変数です。
(src)
←
▼
▲
Function Writables::Enable() as WritablesStack
書き込み可能なフォルダを設定します。
【引数】
返り値
WritableStack オブジェクト
Writables は、
から取得できます。
返り値の WritableStack オブジェクトが、どこからも参照されなくなったら、書き込み
可能では無くなります。
1つ目の WritableStack が存在するときに、2つ目の Writable::Enable をすると、ネスト
して、2つ目の WritableStack のみ有効になります。 2つ目の WritableStack が参照
されなくなったら、1つ目の WritableStack が有効になります。
Set w1 = AppKey.NewWritable( "out1" )
Set w2 = AppKey.NewWritable( "out2" )
Set w1_ = w1.Enable()
'// "out1" が書き込み可能
Set w2_ = w2.Enable()
'// "out2" が書き込み可能
w2_ = Empty
'// "out1" が書き込み可能
w1_ = Empty
(src)
関連
Dim w_:Set w_= AppKey.NewWritable( "." ).Enable()
←
▼
▲
Sub SetWritableMode( Mode as integer )
で指定していないフォルダにライトしようとしたときの動きを設定します。
SetWritableMode F_ErrIfWarn
サンプル
ユーザにライトしていいかどうかを確認します(デフォルト)
E_OutOfWritable エラーにします
警告を無視します(AppKeyClass::SetWritableMode でのみ指定可能)
(src)
writable_path = env("%ProgramFiles%")+"\SampleApp"
Assert InStr( writable_path, "Program Files" ) > 0
AppKey.SetWritableMode F_IgnoreIfWarn
Set w_=AppKey.NewWritable( writable_path ).Enable()
SetWritableMode F_AskIfWarn
Sub AppKeyClass::SetWritableMode( Mode as integer )
関連
サンプル: F_IgnoreIfWarn には、AppKey が必要
Program Files に書き込み許可するときは、以下の手順が最も安全です。
・パスに Program Files が入っていることをチェック
・F_IgnoreIfWarn に設定して警告を抑制して書き込み許可を設定
・F_AskIfWarn に設定を戻す
←
▼
▲
Dim g_CurrentWritables.CurrentPathes as array of string
現在書き込みを許可しているパスの配列。
関連
←
▼
▲
Function OpenForRead( Path as string ) as TextStream
テキストファイルを開きます。(リード用=ファイルから入力します)
【引数】
Path
返り値
開くファイルのパス
ファイルのストリーム
と異なり、エラーがあったら、
エラーメッセージに Path が付きます。
Set c = g_VBS_Lib
Set args = WScript.Arguments.Unnamed
If args.Count = 0 Then
path = InputPath( "ファイルのパス >", c.CheckFileExists )
Else
path = args(0)
End If
Set file = OpenForRead( path )
Do Until file.AtEndOfStream
line = file.ReadLine()
'// If InStr( line, "DEBUG" ) > 0 Then echo line
Loop
file = Empty
または
になります。
→ T_File.vbs # [T_OpenFile]
関連
テスト
既定の文字コードを指定します
文字コードを指定するときは、
を使ってください。
ただし、Shift-JIS, Unicode, UTF-8(BOMあり) は、使わなくても自動的に文字コード
を判定して、正しく読み込みます。
Set cs = new_TextFileCharSetStack( "EUC-JP" )
Set file = OpenForRead( args(0) )
cs = Empty
Do Until file.AtEndOfStream
line = file.ReadLine()
Loop
返り値を使って呼び出せるメソッドは、FileSystemObject::OpenTextFile と同じです。
サンプル
ソース
→ vbslib.vbs
OpenForRead